﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Inference
{
	public static class DomainHierarchier
	{

		public static List<DValues> getDValues(int domId)
		{
			TaleEntities tale = new TaleEntities();
			var doms = tale.Domains.Where(d => d.ID == domId);
			if (doms.Count() > 0)
			{
				var dom = doms.First();

				List<DValues> domDvalues = new List<DValues>();

				foreach (var item in dom.DomainsValues)
				{
					domDvalues.Add(item.DValues);
				}
				return domDvalues;
			}
			return null;
		}
		public static List<DValues> getDValues(int domId, TaleEntities tale)
		{
			var doms = tale.Domains.Where(d => d.ID == domId);
			if (doms.Count() > 0)
			{
				var dom = doms.First();

				List<DValues> domDvalues = new List<DValues>();

				foreach (var item in dom.DomainsValues)
				{
					domDvalues.Add(item.DValues);
				}
				return domDvalues;
			}
			return null;
		}
		public static List<int> getDValuesIndices(int domId)
		{
			TaleEntities tale = new TaleEntities();
			var doms = tale.Domains.Where(d => d.ID == domId);
			if (doms.Count() > 0)
			{
				var dom = doms.First();

				List<int> domDvalues = new List<int>();

				foreach (var item in dom.DomainsValues)
				{
					domDvalues.Add(item.DValues.ID);
				}
				return domDvalues;
			}
			return null;
		}

		public static List<string> getDValuesStrings(int domId)
		{
			TaleEntities tale = new TaleEntities();
			var doms = tale.Domains.Where(d => d.ID == domId);
			if (doms.Count() > 0)
			{
				var dom = doms.First();

				List<string> domDvalues = new List<string>();

				foreach (var item in dom.DomainsValues)
				{
					domDvalues.Add(item.DValues.Value);
				}
				return domDvalues;
			}
			return null;
		}

		public static List<int> getDValuesIndices(string domName)
		{
			TaleEntities tale = new TaleEntities();
			var doms = tale.Domains.Where(d => d.Name == domName);
			if (doms.Count() > 0)
			{
				var dom = doms.First();

				List<int> domDvalues = new List<int>();

				foreach (var item in dom.DomainsValues)
				{
					domDvalues.Add(item.DValues.ID);
				}
				return domDvalues;
			}
			return null;
		}

		//public static Domains GetParent(int domID, TaleEntities tale)
		//{
		//    var doms = tale.Domains.Where(d => d.ID == domID);
		//    if (doms.Count() > 0)
		//    {
		//        var dom = doms.First();

		//        var sortedDoms = tale.Domains.Where(d => d.ID != domID).OrderBy(d => d.DomainsValues.Count).ToList();

		//        System.Windows.Forms.MessageBox.Show("Sorted!");
		//    }
		//    return null;
		//}

		public static Domains GetParent(string domName, TaleEntities tale)
		{
			var doms = tale.Domains.Where(d => d.Name == domName);
			if (doms.Count() > 0)
			{
				var dom = doms.First();
				var domDValues = dom.DomainsValues.OrderBy(dv => dv.Value).ToList();
				int domSize = domDValues.Count;

			//var sortedDoms = tale.Domains.Where(d => d.DomainsValues.Count >= domSize && d.ID != 7 && d.ID != 1).OrderByDescending(d => d.DomainsValues.Count).ToList();

				var sortedDoms = (from d in tale.Domains
								 where d.ID != 1 && d.ID != 7 && d.DomainsValues.Count >= domSize
								  orderby d.DomainsValues.Count descending, d.ID
								 select d).ToList();

				if (sortedDoms.Count > 0)
				{
					int i = sortedDoms.Count - 1;
					while (i >= 0 && sortedDoms[i].Name != domName)
					{
						i--;
					}
					i--;
					while (i >= 0)
					{

						Domains couldBeParent = sortedDoms[i];
						var cbpDValuesIDs = (from dv in couldBeParent.DomainsValues select dv.Value);
						int j = domSize-1;

						while (j>=0 && cbpDValuesIDs.Contains(domDValues[j].Value))
						{
							--j;
						}

						if (j==-1)
						{
							return couldBeParent;
						}
						--i;

					}
				}
			}
			return null;
		}

		public static bool IsEmbracing(string embDomName, string partDomName, TaleEntities tale)
		{
			var domse = tale.Domains.Where(d => d.Name == embDomName);
			var domsp = tale.Domains.Where(d => d.Name == partDomName);
			if (domse.Count() > 0 && domsp.Count() > 0)
			{
				var dome = domse.First();
				var domeDValues = dome.DomainsValues.OrderBy(dv => dv.Value).ToList();

				var domp = domsp.First();
				var dompDValues = domp.DomainsValues.OrderBy(dv => dv.Value).ToList();

				if (domeDValues.Count < dompDValues.Count)
					return false;

				int i = dompDValues.Count - 1;
				while (i >= 0)
				{
					int j = dompDValues.Count - 1;
					var cbpDValuesIDs = (from dv in dome.DomainsValues
										 select dv.Value);

					while (j >= 0 && cbpDValuesIDs.Contains(dompDValues[j].Value))
					{
						--j;
					}

					if (j > -1)
					{
						return false;
					}

					--i;
				}
			}

			return true;
		}
	}
}
